<?php


namespace App\Utils\Lib;


class Redis
{
    //私有的静态属性：存放实例化获得对象
    private static $object;
    private static $redis;
    //私有的构造方法：防止在类外实例化对象
    private function __construct()
    {
        self::$redis = new \Redis();
        self::$redis->connect('notyetcat.vip','6379');
        self::$redis->auth('bind');
        self::$redis->select('7');
    }
    //私有的克隆方法：放置在类外克隆
    public function __clone()
    {
        // TODO: Implement __clone() method.
    }

    //公共的静态方法：为类提供一个统一的入口
    public static function createRedisObject()
    {
        //判断对象是否存在，如果存在则直接返回对象实例，无需创建
        // instanceof  判断对象 是否属于 某个类
        if (!self::$object instanceof Redis)
        {
            //创建对象
            return self::$object = new Redis();
        }
        //直接返回该对象
        return  self::$object;
    }

    /**
     * 选择新的库
     * @param $key
     */
    public function select($key)
    {
        self::$redis->select($key);
    }
    //Redis 连接密码
    function auth($password){
        self::$redis->auth($password);
    }

    /**
     * 使用redis的队列push
     * @param $key
     * @param $data
     * @return bool
     */
    public function Data_lpush($key,$data){
       self::$redis->lpush($key,$data);
       return true;
    }

    /**
     * 将搜索历史存储到Redis列表中，最多存储十个记录
     * @param $key
     * @param $start
     * @param $end
     * @return bool
     */
    public function lTrim($key,$start,$end){
        self::$redis->ltrim($key,$start,$end);
        return true;
    }

    /**
     * 设置搜索历史记录的过期时间为七天
     * @param $key
     * @param $time
     * @return bool
     */
    public function expire($key,$time){
        self::$redis->expire($key,$time);
    }

    /**
     *redis 判断值是否存在某个数据库中
     * @param $key
     * @return bool
     */
    public function sismember($key,$data){
        self::$redis->sIsMember($key,$data);
        return true;
    }

    /**
     *将搜索关键字存储到Redis有序集合中，以搜索次数为分值
     */
    public function zIncrBy($k, $num, $name){
        self::$redis->zincrby($k,$num,$name);
        return true;
    }

    /**
     *获取redis缓存的历史搜索
     */
    public function lRange($key,$start,$end){
        return self::$redis->lRange($key,$start,$end);
    }

    /**
     *获取搜索热搜排行榜 从高到底
     * lak
     */
    public function zRevRange($k,$n,$e){
        return self::$redis->zRevRange($k,$n,$e,true);
    }

    /**
     *获取搜索热搜排行榜 从低到高
     * lak
     */
    public function ZRANGE($k,$n,$e){
        return self::$redis->ZRANGE($k,$n,$e,true);
    }

    /**
     *将验证码存储到redis十分钟
     * lak
     */
    public function setex($key,$time,$code){
        self::$redis->setex($key,$time,$code);
        return true;
    }

    /**
     *获取redis数据
     * lak
     */
    public function GetRedis($key) {
        return self::$redis->get($key);
    }

    /**
     *添加元素之前使用 lrem 命令删除列表中的重复元素
     * @lak
     */
    public function lrem($key,$n,$data) {
        self::$redis->lrem($key,$n,$data);
        return true;
    }

    /**
     *添加元素
     * @lak
     * @param $name
     * @param
     * 添加经纪人详情信息到 redis
     * @return
     */
    public function hset($key,$name,$value)
    {
        return  self::$redis->hset($key,$name,$value);
    }

    /**
     * @param $key
     * @return array|null
     */
    public function sMembers($key)
    {
        $data=self::$redis->sMembers($key);
        if (!$data)  return null;
        return $data;
    }

    /**
     * @param $key
     * @param $value
     * @return bool
     */
    public function set($key,$value){
        return self::$redis->set($key,$value);
    }

    /**
     * redis 永久存储
     * @lak
     */
    public function persist($key){
        self::$redis->persist($key);
        return true;
    }

    /**
     * 地理添加
     * @param $phone
     * @param $code
     * @return bool
     */
    public function geoAdd($key,$longitude,$latiaude,$member)
    {
                                //添加地理位置的坐标（redis名，经度，纬度，房名）
        $result = self::$redis->geoAdd($key, $longitude, $latiaude, $member);
        return $result;
    }

    /**
     * 地理附近搜索
     * @param $phone
     * @param $code
     * @return bool
     */
    public function geoRadius($key,$longitude,$latiaude,$radius,$unit,$options)
    {
                                 //根据用户给定的经纬度坐标来获取指定范围内的地理位置集合
                                 //（redis存入名，经度，纬度，半径范围，单位，返回信息）
        $result = self::$redis->geoRadius($key, $longitude, $latiaude, $radius,$unit,$options);
        return $result;
    }



    /**
     * @param int $id  通过id查询经纪人的详细信息
     * @return array|\Redis
     * @throws \RedisException
     */
    public function hgetAll(int $id)
    {
        return self::$redis->hgetAll($id);
    }

}
